package model;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

/**
 *
 * @author Alvin & Roy
 */
public class Noot extends SpelObject {
    /* De laatste richting waarin de noot zich bewogen heeft */
    private Richting laatsteRichting;
    /* Houdt bij of de noot momenteel beweegt */
    private boolean isMoving;

    /**
     * Constructor
     * @param v Het veld waar de noot geplaatst wordt
     */
    public Noot(Veld v){
        //constructor van SpelObject
        super(v);

        //zet bewegen op false
        isMoving = false;

        //geen laatste richting
        laatsteRichting = null;

        //haal het plaatje van een noot op
        try {
            setImg(ImageIO.read(new File(getIPATH()+"acorn.gif")));
        } catch (IOException e) {
            System.out.println("Fout bij het laden van de recources: " + e);
            System.exit(0);
        }

    }

    /**
     * Kijk of de noot al beweegd
     * @return True als de noot aan het bewegen is
     */
    public boolean isMoving(){
        return isMoving;
    }

    /**
     * Stop het bewegen van de noot
     */
    public void stoppedMoving(){
        isMoving = false;
    }

    /**
     * Beweeg de noot
     * @param r De richting waarin bewogen wordt
     * @return True als het bewegen gelukt is
     */
    public boolean move(Richting r){
        //controleer of de noot niet al beweegd
        if(!isMoving){
            //controleer of het volgende veld bestaat
            if(this.getVeld().getBuur(r) != null){
                //controleer of het volgende veld leeg is
                if(this.getVeld().getBuur(r).getSpelObject() == null){
                    //stel de laatste richting in op de huidige richting
                    laatsteRichting = r;
                    //zet bewegen op true
                    isMoving = true;
                    //maak een nieuwe nootthread aan
                    NootThread thread = new NootThread(this);
                    //start de nootthread
                    thread.start();

                    return true;
                }
            }//Als het veld niet leeg was
            //Haal de buur in de tegengestelde richting
            Veld buur = this.getVeld().getBuur(Richting.getTegengesteld(r));
            //Haal de speler op
            SpelObject speler = buur.getSpelObject();
            //stel het nieuwe veld van de speler in
            speler.setVeld(this.getVeld());
            //stel de speler in als spelobject van het veld
            this.getVeld().setSpelObject(speler);
            //zet de noot op de buur
            buur.setSpelObject(this);
            //stel het buurveld in als veld van de noot
            this.setVeld(buur);
            //teken hed spel opnieuw
            this.paint();
        }
        return false;
    }

    /**
     * Haal de laatste richting op
     * @return De laatste richting waarin de noot bewogen is
     */
    public Richting getLaatsteRichting(){
        return laatsteRichting;
    }

    /**
     * Teken het veld opnieuw
     */
    public void paint(){
        GameMap.teken();
    }

    private class NootThread extends Thread{
        /** de noot die de klasse bestuurd */
        private Noot noot;
        /** is de noot aan het bewegen*/
        private boolean isMoving;

        /**
         * De constructor
         * @param n De noot die de klasse bestuurd
         */
        public NootThread(Noot n){
            //Constructor van thread
            super();

            noot = n;
            isMoving = true;
        }

        /**
         * Het runnen van de thread
         */
        public void run(){
            //zolang de noot beweegd
            while(isMoving){
                //zet een stap, als deze gelukt is wordt isMoving true
                isMoving = this.move(noot.getLaatsteRichting());
                try{
                    //100 ms pauzeren
                    sleep(100);
                }catch(InterruptedException e){
                    System.out.println("Error @ moving noot => " + e);
                }
            }
            //zodra de noot niet meer beweegd -> verlaat de thread
            return;
        }

        /**
         * Beweeg de noot
         * @param r De richting om in te bewegen
         * @return Bewegen mogelijk ja of nee
        */
        public boolean move(Richting r){
            //Haal de buur waarheen de noot wil bewegen op
            Veld buur = noot.getVeld().getBuur(r);
            //als de buur bestaat & de buur is leeg
            if(buur != null && buur.getSpelObject() == null){
                //Verwijder de noot van het huidige veld
                noot.getVeld().setSpelObject(null);
                //Zet de noot op het buurveld
                buur.setSpelObject(noot);
                //Voeg de noot toe aan de speler
                noot.setVeld(buur);

                noot.paint();
                return true;
            }else{
                //stel isMoving van de noot in op false
                noot.stoppedMoving();

                return false;
            }
        }
    }
}
